home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / clearmem.arc / bmov.asm < prev    next >
Assembly Source File  |  1988-08-19  |  3KB  |  106 lines

  1.  
  2.         ;   BMOV(src, dst, len)
  3.         ;
  4.         ;   char *src, *dst;
  5.         ;   long len;
  6.         ;
  7.         ;   The memory move algorithm is somewhat more of a mess
  8.         ;   since we must do it either ascending or decending.
  9.  
  10.         public    _bmov
  11. _bmov:        move.l    4(sp),A0
  12.         move.l    8(sp),A1
  13.         move.l    12(sp),D0
  14.         cmp.l    A0,A1        ;move to self
  15.         beq    .bmend
  16.         bls    .bmup
  17. .bmdown     adda.l    D0,A0        ;descending copy
  18.         adda.l    D0,A1
  19.         move.w    A0,D1        ;CHECK WORD ALIGNED
  20.         btst.l    #0,D1
  21.         bne    .bmdown1
  22.         move.w    A1,D1
  23.         btst.l    #0,D1
  24.         bne    .bmdown1
  25.         cmp.l    #259,D0         ;chosen by calculation.
  26.         blo    .bmdown8
  27.  
  28.         move.l    D0,D1            ;overhead for bmd44: ~360
  29.         divu    #44,D1
  30.         bvs    .bmdown8        ;too big (> 2,883,540)
  31.         movem.l D2-D7/A2-A6,-(sp)   ;use D2-D7/A2-A6 (11 regs)
  32.         move.l    #11*4,D0
  33.         bra    .bmd44b
  34. .bmd44a     sub.l    D0,A0            ;8        total 214/44bytes
  35.         movem.l (A0),D2-D7/A2-A6    ;12 + 8*11  4.86 cycles/byte
  36.         movem.l D2-D7/A2-A6,-(A1)   ; 8 + 8*11
  37. .bmd44b     dbf    D1,.bmd44a        ;10
  38.         swap    D1            ;D0<15:7> already contain 0
  39.         move.w    D1,D0            ;D0 = remainder
  40.         movem.l (sp)+,D2-D7/A2-A6
  41.  
  42. .bmdown8    move.w    D0,D1            ;D1<2:0> = #bytes left later
  43.         lsr.l    #3,D0            ;divide by 8
  44.         bra    .bmd8b
  45. .bmd8a        move.l    -(A0),-(A1)         ;20         total 50/8bytes
  46.         move.l    -(A0),-(A1)         ;20         = 6.25 cycles/byte
  47. .bmd8b        dbf    D0,.bmd8a        ;10
  48.         sub.l    #$10000,D0
  49.         bcc    .bmd8a
  50.         move.w    D1,D0            ;D0 = 0 to 7 bytes
  51.         and.l    #7,D0
  52.         bne    .bmdown1
  53.         rts
  54.  
  55. .bmd1a        move.b    -(A0),-(A1)         ;12         total 22/byte
  56. .bmdown1                    ;        = 22 cycles/byte
  57. .bmd1b        dbf    D0,.bmd1a        ;10
  58.         sub.l    #$10000,D0
  59.         bcc    .bmd1a
  60.         rts
  61.  
  62. .bmup        move.w    A0,D1            ;CHECK WORD ALIGNED
  63.         btst.l    #0,D1
  64.         bne    .bmup1
  65.         move.w    A1,D1
  66.         btst.l    #0,D1
  67.         bne    .bmup1
  68.         cmp.l    #259,D0         ;chosen by calculation
  69.         blo    .bmup8
  70.  
  71.         move.l    D0,D1            ;overhead for bmu44: ~360
  72.         divu    #44,D1
  73.         bvs    .bmup8            ;too big (> 2,883,540)
  74.         movem.l D2-D7/A2-A6,-(sp)   ;use D2-D7/A2-A6 (11 regs)
  75.         move.l    #11*4,D0
  76.         bra    .bmu44b
  77. .bmu44a     movem.l (A0)+,D2-D7/A2-A6   ;12 + 8*11  ttl 214/44bytes
  78.         movem.l D2-D7/A2-A6,(A1)    ;8  + 8*11  4.86 cycles/byte
  79.         add.l    D0,A1            ;8
  80. .bmu44b     dbf    D1,.bmu44a        ;10
  81.         swap    D1            ;D0<15:7> already contain 0
  82.         move.w    D1,D0            ;D0 = remainder
  83.         movem.l (sp)+,D2-D7/A2-A6
  84.  
  85. .bmup8        move.w    D0,D1            ;D1<2:0> = #bytes left later
  86.         lsr.l    #3,D0            ;divide by 8
  87.         bra    .bmu8b
  88. .bmu8a        move.l    (A0)+,(A1)+         ;20         total 50/8bytes
  89.         move.l    (A0)+,(A1)+         ;20         = 6.25 cycles/byte
  90. .bmu8b        dbf    D0,.bmu8a        ;10
  91.         sub.l    #$10000,D0
  92.         bcc    .bmu8a
  93.         move.w    D1,D0            ;D0 = 0 to 7 bytes
  94.         and.l    #7,D0
  95.         bne    .bmup1
  96.         rts
  97.  
  98. .bmu1a        move.b    (A0)+,(A1)+
  99. .bmup1
  100. .bmu1b        dbf    D0,.bmu1a
  101.         sub.l    #$10000,D0
  102.         bcc    .bmu1a
  103. .bmend        rts
  104.  
  105.  
  106.